package leetcode.linkedlist;

/**
 * 24. 两两交换链表中的节点
 *
 */
public class SwapPairs {

    public static void main(String[] args) {
        SwapPairs solution = new SwapPairs();

        Integer[] arr1 = {4, 2, 1, 3};
        ListNode head = ListNode.makeLinkedList(arr1);

        ListNode newList = solution.swapPairs(head);
        System.out.println(newList.list());
    }

    /**
     * 递归法
     *
     * @param head 链表
     * @return
     */
    public ListNode swapPairs(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        // 原始链表的第二个节点变成新的链表的头节点
        ListNode newHead = head.next;
        // 链表中的其余节点的两两交换可以递归地实现, 原始链表的头节点直接指向剩余的节点
        head.next = swapPairs(newHead.next);
        // 原始链表的头节点变成新的链表的第二个节点
        newHead.next = head;
        return newHead;
    }

    /**
     * 迭代法
     *
     * @param head  链表
     * @return
     */
    public ListNode swapPairs1(ListNode head) {
        ListNode dummyHead = new ListNode(0);
        dummyHead.next = head;
        ListNode temp = dummyHead;
        while (temp.next != null && temp.next.next != null) {
            ListNode node1 = temp.next;
            ListNode node2 = temp.next.next;
            temp.next = node2;
            node1.next = node2.next;
            node2.next = node1;
            temp = node1;
        }
        return dummyHead.next;
    }

}
